package persistent

import (
	"context"
	"time"

	"gorm.io/gorm"
)

const TableNameNodeTemplate = "node_template"

type NodeTemplateClient struct {
	db *gorm.DB `name:"saas_db"`
}

func NewNodeTemplateClient(db *gorm.DB) *NodeTemplateClient {
	return &NodeTemplateClient{db: db}
}

// QueryNodeTemplateByID 根据ID查询节点模板
// 参数:
//   ctx: 上下文
//   id: 节点模板ID
// 返回值:
//   result: 节点模板实体
//   err: 错误信息
func (w *NodeTemplateClient) QueryNodeTemplateByID(ctx context.Context, id string) (result NodeTemplate, err error) {
	err = w.db.WithContext(ctx).Take(&result, "id = ?", id).Error
	return result, err
}

// QueryNodeTemplatesByWorkflowTemplateID 根据工作流模板ID查询所有节点模板
// 参数:
//   ctx: 上下文
//   workflowTemplateID: 工作流模板ID
// 返回值:
//   result: 节点模板列表
//   err: 错误信息
func (w *NodeTemplateClient) QueryNodeTemplatesByWorkflowTemplateID(ctx context.Context, workflowTemplateID string) (result []NodeTemplate, err error) {
	err = w.db.WithContext(ctx).Where("workflow_template_id = ?", workflowTemplateID).Find(&result).Error
	return result, err
}

// CreateTX 在事务中创建节点模板
// 参数:
//   ctx: 上下文
//   nodeTemplate: 节点模板实体
//   tx: 数据库事务
// 返回值:
//   err: 错误信息
func (w *NodeTemplateClient) CreateTX(ctx context.Context, nodeTemplate NodeTemplate, tx *gorm.DB) (err error) {
	return tx.WithContext(ctx).Create(&nodeTemplate).Error
}

type NodeTemplate struct {
	ID                 string `gorm:"column:id;type:varchar(64);primaryKey;comment:Snowflake ID | 全局唯一ID"`
	Name               string `gorm:"column:name;type:varchar(64)"`
	NextNodeTemplateID string `gorm:"column:next_node_template_id;type:varchar(64)"`
	Kind               int    `gorm:"type:tinyint(5);not null;column:kind;"`
	WorkflowTemplateID string `gorm:"column:workflow_template_id;type:varchar(64)"`
	ConditionsRaw      string `gorm:"column:conditions_raw;type:json"`
	ApprovalStrategy   string `gorm:"column:approval_strategy;type:varchar(8)"`
	// BusinessParams 业务参数
	BusinessParams     string `gorm:"column:business_params;type:json"`

	CreatedAt time.Time `gorm:"column:created_at;comment:Created Time | 创建时间" json:"created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at;comment:Updated Time | 更新时间" json:"updated_at"`
}

func (w NodeTemplate) TableName() string {
	return TableNameNodeTemplate
}
